<?php

/*
 * Абстрактный класс контроллера
 * 
 */

namespace T4;

abstract class Controller {

    	/**
	 *
	 * @var array Массив параметров, переданных роутером
	 */
	public $parameters;

	/**
	 *
	 * @var \T4\Application Ссылка на объект приложения, которому принадлежит контроллер
	 */
	public $application;

	/**
	 * Ссылка на объект View, заранее созданный и настроенный на приложение
	 * @var \T4\View 
	 */
	public $view;

	/**
	 *
	 * @var Theme Ссылка на объект текущей темы сайта
	 */
	public $theme;

	/**
	 *
	 * @var \T4\DB Ссылка на объект соединения с базой данных
	 */
	public $db;
        
        /**
         * Переменная - контейнер для возвращаемого действиями значения
         * @var \T4\Standard 
         */
        public $output;

	final public function __construct() {

		/**
		 * Определяем полное имя класса контроллера, 
		 * а исходя из него - имя приложения, к которому относится контроллер
		 */
		$className = get_called_class();
		preg_match("/APPS\\\\(.+?)\\\\/i", $className, $matches);
		$applicationName = strtolower($matches[1]);
                
                /**
                 * Связываем тему с контроллером
                 */
                $this->theme = FrontController::$theme;

		/**
		 * Связываем контроллер с приложением
		 */
		$this->application = Application::getInstance($applicationName);
		$this->db = $this->application->db;
		$this->view = $this->application->getView();
		
                $this->output = new Standard;
                
	}

	/**
	 * Выполнить действие контроллера
	 * @param string $action Действие
	 */
	final public function action($action) {

		$this->preAction();

		$action = 'action' . ucfirst($action);
		$this->$action();

		$this->postAction();

                return $this->output;
		
	}

	/**
	 * Методы, которые выполняюся до и после действия.
	 * Можно переопределить в конкретном контроллере.
	 */
	protected function preAction() {
		return '';
	}

	protected function postAction() {
		return '';
	}
	
	public function redirect($url) {
		HTTP::redirect($url);
	}

}